2.4 基本类型
清晰完备的预定义基础类型,使得开发跨平台应用时无须过多考虑符号和长度差异。
/images/image00220.jpeg)
/images/image00221.jpeg)
支持八进制、十六进制以及科学记数法。标准库math定义了各数字类型的取值范围。
import(
"fmt"
"math"
)
func main() {
a,b,c:=100,0144,0x64
fmt.Println(a,b,c)
fmt.Printf("0b%b, %#o, %#x\n",a,a,a)
fmt.Println(math.MinInt8,math.MaxInt8)
}
输出:
100 100 100
0b1100100,0144,0x64
-128 127
标准库strconv可在不同进制(字符串)间转换。
import"strconv"
func main() {
a, _ :=strconv.ParseInt("1100100",2,32)
b, _ :=strconv.ParseInt("0144",8,32)
c, _ :=strconv.ParseInt("64",16,32)
println(a,b,c)
println("0b" +strconv.FormatInt(a,2))
println("0" +strconv.FormatInt(a,8))
println("0x" +strconv.FormatInt(a,16))
}
输出:
100 100 100
0b1100100
0144
0x64
使用浮点数时,须注意小数位的有效精度,相关细节可参考IEEE-754标准。
func main() {
var a float32=1.1234567899 // 注意:默认浮点类型是float64
var b float32=1.12345678
var c float32=1.123456781
println(a,b,c)
println(a==b,a==c)
fmt.Printf("%v%v, %v\n",a,b,c)
}
输出:
+1.123457e+000+1.123457e+000+1.123457e+000
true true
1.1234568 1.1234568,1.1234568
别名
在官方的语言规范中,专门提到两个别名。
byte alias for uint8
rune alias for int32
别名类型无须转换,可直接赋值。
func test(x byte) {
println(x)
}
func main() {
var a byte=0x11
var b uint8=a
var c uint8=a+b
test(c)
}
但这并不表示,拥有相同底层结构的就属于别名。就算在64位平台上int和int64结构完全一致,也分属不同类型,须显式转换。
func add(x,y int)int{
return x+y
}
func main() {
var x int=100
var y int64=x // 错误:cannot use x(type int)as type int64 in assignment
add(x,y) // 错误:cannot use y(type int64)as type int in argument to add
}